package com.hjk.common.utils.lambda;

import com.hjk.common.utils.check.Check;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 函数式接口工具类
 *
 * @author huangjunkai
 * @version 1.0
 * @date 2020/8/12 20:58
 */
public class FunctionUtils {

    /**
     * 简单的函数式接口
     *
     * @param list       集合
     * @param arithmetic 对集合的操作
     * @param <T>        泛型
     * @return 修改后的集合
     */
    public static <T> List<T> arithmetic(List<T> list, Arithmetic<T> arithmetic) {
        Check.checkIsNotEmpty(list, "集合不能为空");
        Check.checkIsNotEmpty(arithmetic, "表达式不能为空");
        return arithmetic.arithmetic(list);
    }

    /**
     * 简单的函数式接口 数字算术
     */
    public static int arithmeticNumber(int i, ArithmeticNumber arithmeticNumber) {
        return arithmeticNumber.arithmeticNumber(i);
    }

    @Test
    public void test2() {
        List<String> list = Arrays.asList("a", "b", "c", "d");
        //函数方法的实现
        Arithmetic<String> arithmetic = a -> a.stream().map(s -> "@" + s).collect(Collectors.toList());
        System.out.println(FunctionUtils.arithmetic(list, arithmetic));
    }

    @Test
    public void test1() {
        //数字抽象封装
        System.out.println(arithmeticNumber(10, p -> p * 10));

    }


}

/**
 * 集合操作
 */
@FunctionalInterface
interface Arithmetic<T> {
    List<T> arithmetic(List<T> list);
}

/**
 * 数字算子
 */
@FunctionalInterface
interface ArithmeticNumber {
    int arithmeticNumber(int i);
}
